﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Data.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Configuration;
using System.Data.SqlClient;
using Website.Logger;
using System.Drawing;
using DAL;
using BOL;
using WebLib;
using System.Web.Script.Services;
using System.Web.Services;
using UtilityExtensions;
namespace UILGestion.Control
{
    public partial class ECItemSeleccionPanel : System.Web.UI.UserControl
    {

        public List<EstructuraCostoItemRecursoInfo> ItemLista
        {
            get
            {
                List<EstructuraCostoItemRecursoInfo> ItemLista = new List<EstructuraCostoItemRecursoInfo>();

                var lista = (List<EstructuraCostoItemRecursoInfo>)Session[idRecursoPartirList.Value.ToString()];
                if (lista.Count > 0)
                {
                    foreach (GridViewRow row in itemGridView.Rows)
                    {
                        CheckBox cb = (CheckBox)(row.FindControl("chkEmployeeSelector"));
                        if (cb != null && cb.Checked)
                        {
                            Int32 employeeId = (Int32)itemGridView.DataKeys[row.RowIndex].Value;
                            EstructuraCostoItemRecursoInfo item = lista.Single(p => p.idInternal == employeeId);
                            ItemLista.Add(item);
                        }
                    }
                }
                return ItemLista;
            }
        }

     
        public int idestructuraCostoitem
        {
            get
            {
                return int.Parse(idEstructuraCostoPartir.Value);
            }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                if (!this.IsPostBack)
                {
                    idEstructuraCosto.Value = (string)Request.QueryString["id"];
                   
                    FormatForm();

                }
            }
            catch (SqlException sqlex)
            {
                WebServerSideSqlError.Log(sqlex);
                ScriptManager.RegisterClientScriptBlock(this.Page, typeof(UserControl),
                 "uniqueKey" + DateTime.Now, "alert('" + sqlex.Message.Replace("'", "") + "');", true);


            }
            catch (Exception ex)
            {
                WebServerSideError.Log(ex);
                ScriptManager.RegisterClientScriptBlock(this.Page, typeof(UserControl),
                 "uniqueKey" + DateTime.Now, "alert('" + ex.Message.Replace("'", "") + "');", true);

            }

            //FormatForm();

        }
      
        public void LoadRecurso(int idMoneda,int idObra,string idgrupado)
        {
            try
            {
                List<EstructuraCostoItemRecursoInfo> YaAgrupado =
                    (List<EstructuraCostoItemRecursoInfo>)Session[idgrupado];
                idRecursoAgrupado.Value = idgrupado;

              
                List<EstructuraCostoItemRecursoInfo> ECItemList = new List<EstructuraCostoItemRecursoInfo>();
                // todos aquellos que   pueden ser agrupoados solo de nivel 0,
                //  y no son agrupados,no juntados,ni el nuevo juntado
                int idEstructuraCostoInt = int.Parse(idEstructuraCosto.Value);

                var q = from a in DbUtil.Db.EstructuraCostoItems
                        where a.idEstructuraCosto == idEstructuraCostoInt
                                     & 
                                    a.nivel == 0 & 
                                    a.bitsel == true &
                                    a.idMoneda == idMoneda &
                                    a.idAgrupadoDestino == null &
                                    a.idJuntoPadre == null
                                    & a.total.Value - a.totalUso.Value > 0
                                    & a.totalUso==0
                                    & a.totalReUso==0 //para no ser utilizado por reuso
                                    & a.idInsumo != 12954
                                    select a;
                
                

                // tambien quitar el padres de  juntos
                //traemos los padres juntos
                //aqui los que tienen padre
                var qw = from a in DbUtil.Db.EstructuraCostoItems
                         where a.idEstructuraCosto == idEstructuraCostoInt &
                         a.idJuntoPadre != null &
                         a.total - a.totalUso > 0
                         select a.idInternal;

                var resultado = from a in q
                                where !qw.Contains(a.idInternal)
                                select new EstructuraCostoItemRecursoInfo
                                {
                                    cantidad = a.cantidad.Value,
                                    cantidadStr = String.Format("{0:N4}", a.cantidad.Value),
                                    codigo = a.codigo,
                                    descripcion = a.descripcion,
                                    idInsumo = a.idInsumo.Value,
                                    idInternal = a.idInternal,
                                    precio = a.precio.Value,
                                    precioStr = string.Format("{0} {1:N4}", a.Moneda.simbol, a.precio.Value),
                                    total = a.total.Value - a.totalUso.Value,
                                    totalStr = string.Format("{0} {1:N2}", a.Moneda.simbol, a.total.Value-a.totalUso),
                                    unidad = a.unidad,
                                    idPresupuesto = (a.idRecurso == null) ? 0 : a.Recurso.Partida.idPresupuesto,
                                  idRecurso = (a.idRecurso == null) ? 0 : a.idRecurso.Value,
                                    presupuesto = (a.idRecurso == null) ? "" : a.Recurso.Partida.Presupuesto.abreviacion,
                                    partida = (a.idRecurso == null) ? "" : a.Recurso.Partida.codigo +"-"+a.Recurso.Partida.descripcion,
                                       moneda=a.Moneda,
                                     };


                ECItemList = resultado.ToList();

                var itemNotaCredito = new EstructuraCostoBL().GetSaldoNotaCredito(idObra, idMoneda);
                if (itemNotaCredito.total>0)
                {
                    ECItemList.Add(itemNotaCredito);
                }
                //-----------------------------------------

                // retiramos la coleccion de item que se tiene  ya ingresado en el configurador de agrupados

                foreach (EstructuraCostoItemRecursoInfo item in YaAgrupado)
                    {
                        // busco en  la coleccion que consegui de la DB
                        if (item.idInsumo == 12954)
                        {
                            ECItemList.RemoveAll(p => p.idInsumo == item.idInsumo);
                        }

                        //EstructuraCostoItemRecursoInfo ECItem = ECItemList.Single(p => p.idInternal == item.idInternal);

                        ECItemList.RemoveAll(p => p.idInternal == item.idInternal);
                    }



                Session[idRecursoPartirList.Value.ToString()] = ECItemList;

                Moneda moneda = DbUtil.Db.Monedas.Single(p => p.idInternal == idMoneda);
                simbolMoneda.Value = moneda.simbol;

                BindDataItem();
            }
            catch (SqlException sqlex)
            {
                WebServerSideSqlError.Log(sqlex);
                ScriptManager.RegisterClientScriptBlock(this.Page, typeof(UserControl),
                 "uniqueKey" + DateTime.Now, "alert('" + sqlex.Message.Replace("'", "") + "');", true);


            }
            catch (Exception ex)
            {
                WebServerSideError.Log(ex);
                ScriptManager.RegisterClientScriptBlock(this.Page, typeof(UserControl),
                 "uniqueKey" + DateTime.Now, "alert('" + ex.Message.Replace("'", "") + "');", true);

            }

        }

        private void FormatForm()
        {


            idRecursoPartirList.Value = Parametros.GenerarID().ToString();
            var m = DbUtil.Db.Monedas;


            List<EstructuraCostoItemRecursoInfo> itemList2 = new List<EstructuraCostoItemRecursoInfo>();
            Session[idRecursoPartirList.Value.ToString()] = itemList2;

          


        }
        private void resetEmpty()
        {
            if (itemGridView.Rows.Count == 0)
            {
                List<EstructuraCostoItemRecursoInfo> itemList0 = new List<EstructuraCostoItemRecursoInfo>();
                EstructuraCostoItemRecursoInfo itemcero = new EstructuraCostoItemRecursoInfo();
                itemcero.idInternal = 0;
                itemList0.Add(itemcero);
                itemGridView.DataSource = itemList0;
                itemGridView.DataBind();
                itemGridView.Rows[0].Visible = false;
            }

        }
        private void setEstadistica()
        {
            List<EstructuraCostoItemRecursoInfo> itema = this.ItemLista;

            
            TotalLabel.Text = String.Format("{0} {1:N}", simbolMoneda.Value, itema.Sum(p => p.total));
            totalUpdatePanel.Update();

        }
        private void BindDataItem()
        {

            List<EstructuraCostoItemRecursoInfo> item =
                (List<EstructuraCostoItemRecursoInfo>)Session[idRecursoPartirList.Value.ToString()];


            itemGridView.DataSource = item;
            itemGridView.DataBind();
            resetEmpty(); //necesario para add

            seleccionUpdatePanel.Update();
            //partirUpdatePanel.Update();


        }
        protected void ItemAllSelectChange(object sender, EventArgs e)
        {
            //solo los seleccionados
            //seleccionamos todos los  item
            foreach (GridViewRow row in itemGridView.Rows)
            {
                CheckBox cb = (CheckBox)(row.FindControl("chkEmployeeSelector"));
                cb.Checked = ((CheckBox)sender).Checked;
            }
            seleccionUpdatePanel.Update();
            setEstadistica();      

        }
        protected void ItemSelectChange(object sender, EventArgs e)
        {
            //solo los seleccionados
            //seleccionamos todos los  item
                       
            setEstadistica();

        }
         
    }
}